home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 21 / CU Amiga Magazine's Super CD-ROM 21 (1998)(EMAP Images)(GB)[!][issue 1998-04].iso / CUCD / Magazine / C_Tutorial / Part-9 / wb2 / main.c < prev    next >
C/C++ Source or Header  |  1998-02-01  |  6KB  |  240 lines

  1. #include<dos/rdargs.h>
  2. #include<exec/libraries.h>
  3. #include<workbench/startup.h>
  4. #include<workbench/workbench.h>
  5.  
  6. #include<stdio.h>
  7. #include<stdlib.h>
  8.  
  9. #include<clib/dos_protos.h>
  10. #include<clib/exec_protos.h>
  11. #include<clib/icon_protos.h>
  12.  
  13. #include "gui.h"
  14. #include "idcmp.h"
  15. #include "loadsave.h"
  16. #include "arexx.h"
  17.  
  18. /* The library base global variables */
  19. /* (The different style of opening libraries requires these to be initialised to NULL) */
  20. struct Library* GfxBase = NULL;
  21. struct Library* IntuitionBase = NULL;
  22. struct Library* GadToolsBase = NULL;
  23. struct Library* AslBase = NULL;
  24. struct Library* DosBase = NULL;
  25. struct Library* IFFBase = NULL;
  26. struct Library* RexxSysBase = NULL;
  27. struct Library* IconBase = NULL;
  28.  
  29. /* Need to give prototypes for our functions */
  30. static int  createAll(struct WBStartup*);
  31. static void freeAll(void);
  32. static int  openLibs(void);
  33. static void closeLibs(void);
  34.  
  35. /* The alternative "main()" for Workbench startup */
  36. void wbmain(struct WBStartup*);
  37.  
  38. /* The shared starting point of our program */
  39. static void realmain(struct WBStartup*);
  40.  
  41. #define TT_DEPTH       "DEPTH"
  42. #define TT_PORTNAME    "PORTNAME"
  43.  
  44. #define ARGS_TEMPLATE  "FILE," TT_DEPTH "/N," TT_PORTNAME
  45.  
  46. enum ARGS { ARG_FILENAME, ARG_DEPTH, ARG_PORTNAME, NUM_ARGS };
  47.  
  48. #define DEFAULT_PORTNAME "HELLOPAINTER"
  49. #define DEFAULT_DEPTH    (4)
  50.  
  51. /* The CLI starting point for StormC, but the general start for SAS/C */
  52. void main(int argc, char** argv)
  53. {
  54.     /* argc should never be zero: SAS/C uses this to indicate WB start */
  55.   if(argc == 0)
  56.         wbmain((struct WBStartup*)argv);
  57.     else
  58.         realmain(NULL);
  59. }
  60.  
  61. /* The WB starting point for StormC */
  62. void wbmain(struct WBStartup* wbmsg)
  63. {
  64.     /* WB-specific startup could go here */
  65.     realmain(wbmsg);
  66. }
  67.  
  68. /* The start of the program */
  69. static void realmain(struct WBStartup* wbmsg)
  70. {
  71.     if(createAll(wbmsg))
  72.         handleIDCMP();
  73.     freeAll();
  74. }
  75.  
  76. static struct RDArgs* rdargs = NULL;
  77. static struct DiskObject* dobj = NULL;
  78.  
  79. static int createAll(struct WBStartup* wbmsg)
  80. {
  81.     int success = FALSE;
  82.   if(openLibs())
  83.     {
  84.         /* We'll only set portname if successful */
  85.         char* portname = NULL;
  86.         UBYTE depth;
  87.         char* filename = NULL;
  88.         BPTR currdir = NULL;
  89.         if(wbmsg)
  90.         {
  91.             /* WB bit, use Tool Types */
  92.             currdir = CurrentDir(wbmsg->sm_ArgList[0].wa_Lock);
  93.             if(dobj = GetDiskObject(wbmsg->sm_ArgList[0].wa_Name))
  94.             {
  95.                 UBYTE** tt = (UBYTE**)dobj->do_ToolTypes;
  96.                 char* depthptr = FindToolType(tt, TT_DEPTH);
  97.                 portname = FindToolType(tt, TT_PORTNAME);
  98.                 /* Use the default if a Tool Type was not specified */
  99.                 if(portname == NULL)
  100.                     portname = DEFAULT_PORTNAME;
  101.                 if(depthptr)
  102.                     depth = atoi(depthptr);
  103.                 else
  104.                     depth = DEFAULT_DEPTH;
  105.             }
  106.             else
  107.                 printf("Error: could not read Tool Types\n");
  108.             /* Reset current directory, if we moved it */
  109.             if(currdir)
  110.             {
  111.                 CurrentDir(currdir);
  112.                 currdir = NULL;
  113.             }
  114.             if(wbmsg->sm_NumArgs > 1)
  115.             {
  116.                 currdir = CurrentDir(wbmsg->sm_ArgList[1].wa_Lock);
  117.                 filename = wbmsg->sm_ArgList[1].wa_Name;
  118.             }
  119.         }
  120.         else
  121.         {
  122.             /* CLI bit, use ReadArgs() */
  123.             LONG args[NUM_ARGS];
  124.             int i;
  125.             /* Initialise our args to NULL */
  126.             /* (This way we will know if an argument was specified) */
  127.             for(i=0; i<NUM_ARGS; i++)
  128.                 args[i] = NULL;
  129.             if(rdargs = ReadArgs(ARGS_TEMPLATE, args, NULL))
  130.             {
  131.                 LONG* depthptr = (LONG*)(args[ARG_DEPTH]);
  132.                 portname = (char*)(args[ARG_PORTNAME]);
  133.                 filename = (char*)(args[ARG_FILENAME]);
  134.                 /* Use the default if an argument was not specified */
  135.                 if(portname == NULL)
  136.                     portname = DEFAULT_PORTNAME;
  137.                 if(depthptr == NULL)
  138.                     depth = DEFAULT_DEPTH;
  139.                 else
  140.                     depth = (UBYTE)(*depthptr);
  141.             }
  142.             else
  143.                 printf("Error: could not read arguments\n");
  144.         }
  145.         if(portname)
  146.         {
  147.             if(createARexxPort(portname) && createArgs() && openGUI(depth,0,0,0))
  148.             {
  149.                 success = TRUE;
  150.                 if(filename)
  151.                     loadfile(filename);
  152.             }
  153.         }
  154.         /* Reset current directory, if we moved it */
  155.         if(currdir)
  156.             CurrentDir(currdir);
  157.     }
  158.     return success;
  159. }
  160.  
  161. static void freeAll()
  162. {
  163.     freeReqs();
  164.     closeGUI();
  165.     freeArgs();
  166.     freeARexxPort();
  167.     if(rdargs)
  168.         FreeArgs(rdargs);
  169.     if(dobj)
  170.         FreeDiskObject(dobj);
  171.     closeLibs();
  172. }
  173.  
  174. /* Try to open all the libraries -- return TRUE on success */
  175. static int openLibs()
  176. {
  177.     if((GfxBase = OpenLibrary("graphics.library",37)) == NULL)
  178.     {
  179.         printf("Error: could not open graphics.library\n");
  180.         return FALSE;
  181.     }
  182.     if((IntuitionBase = OpenLibrary("intuition.library",37)) == NULL)
  183.     {
  184.         printf("Error: could not open intuition.library\n");
  185.         return FALSE;
  186.     }
  187.     if((GadToolsBase = OpenLibrary("gadtools.library",37)) == NULL)
  188.     {
  189.         printf("Error: could not open gadtools.library\n");
  190.         return FALSE;
  191.     }
  192.     if((AslBase = OpenLibrary("asl.library",37)) == NULL)
  193.     {
  194.         printf("Error: could not open asl.library\n");
  195.         return FALSE;
  196.     }
  197.     if((DosBase = OpenLibrary("dos.library",37)) == NULL)
  198.     {
  199.         printf("Error: could not open dos.library\n");
  200.         return FALSE;
  201.     }
  202.     if((IFFBase = OpenLibrary("iff.library",23)) == NULL)
  203.     {
  204.         printf("Error: could not open iff.library\n");
  205.         return FALSE;
  206.     }
  207.     if((RexxSysBase = OpenLibrary("rexxsyslib.library",35)) == NULL)
  208.     {
  209.         printf("Error: could not open rexxsyslib.library\n");
  210.         return FALSE;
  211.     }
  212.     if((IconBase = OpenLibrary("icon.library",37)) == NULL)
  213.     {
  214.         printf("Error: could not open icon.library\n");
  215.         return FALSE;
  216.     }
  217.   return TRUE;
  218. }
  219.  
  220. /* Close any open library */
  221. static void closeLibs()
  222. {
  223.     if(IconBase)
  224.         CloseLibrary(IconBase);
  225.     if(RexxSysBase)
  226.         CloseLibrary(RexxSysBase);
  227.     if(IFFBase)
  228.         CloseLibrary(IFFBase);
  229.     if(DosBase)
  230.         CloseLibrary(DosBase);
  231.     if(AslBase)
  232.         CloseLibrary(AslBase);
  233.     if(GadToolsBase)
  234.         CloseLibrary(GadToolsBase);
  235.     if(IntuitionBase)
  236.         CloseLibrary(IntuitionBase);
  237.     if(GfxBase)
  238.         CloseLibrary(GfxBase);
  239. }
  240.